package com.roden.study.algorithm.bit;

import org.junit.Test;

/**
 * &：按位与 （同1为1，其余为0)  、|：按位或 (有1为1，同0为0)、~：按位非（1为0，0为1） 、^：按位异或（相异为1，相同为0）
 * <<：左位移运算符（符号位不变，低位补0）、 >>：右位移运算符（低位溢出，符号位不变，并用符号位补溢出的高位）、 >>>：无符号右移运算符（低位溢出，高位补0）
 * 原码：第一位为符号位：0为正，1为负
 * 内存使用补码存放数字：一个数如果为正，则它的原码、反码、补码相同；一个数如果为负，则符号位为1，其余各位是对原码取反(反码)，然后整个数加1
 */
public class BitOperatorTest
{
	@Test
	public void exchange(){
		int a=3,b=5;
		a=a+b;
		b=a-b;
		a=a-b;
		System.out.println("a>"+a +",b>"+b);
		System.out.println(getBinaryString(a));
		System.out.println(getBinaryString(b));
		a=a^b;
		System.out.println(getBinaryString(3 ^ 5));
		System.out.println(a);
		b=a^b;
		System.out.println(b);
		a=a^b;
		System.out.println(a);
		System.out.println("a>"+a +",b>"+b);
	}
	public static void main(String[] args)
	{
		System.out.println(Byte.MAX_VALUE);
		System.out.println(Short.MAX_VALUE);
		System.out.println(Character.MAX_VALUE);
		System.out.println(getBinaryString(-1));
		
		System.out.println(getBinaryString(Integer.MAX_VALUE));
		//补码形式： -0原码形式
		System.out.println(getBinaryString(Integer.MAX_VALUE+1));
		System.out.println(getBinaryString(Integer.MAX_VALUE*-1));
		System.out.println(getBinaryString(5));
		System.out.println(getBinaryString(9));
		System.out.println(getBinaryString("9-5(",9-5));
		System.out.println(getBinaryString("5 & 9(",5 & 9));
		System.out.println(getBinaryString("5 | 9(",5 | 9));
		System.out.println(getBinaryString("5 ^ 9(",5 ^ 9)); 
		System.out.println("-----------------------------------------------------------------");
		System.out.println(getBinaryString(-5));
		System.out.println(getBinaryString("~-5(",~-5));
		System.out.println("--------------------------------------------------------------------");
		System.out.println(getBinaryString("5 << 2(",5 << 2));
		System.out.println(getBinaryString("-5 << 2(",-5 << 2));
		System.out.println(getBinaryString("-5 >> 2(",-5 >> 2));
		System.out.println(getBinaryString("-5 >>> 2(",-5 >>> 2)); 
	}
	public static String getBinaryString(Integer num){
		String temp=Integer.toBinaryString(num).toString();
		String str="";
		for(int i=0;i<32-temp.length();i++)
			str="0"+str;
		String s="";
		for(int i=0;i<32-num.toString().length();i++)
			s=" "+s;
		return s+num+":"+str+temp;
	}
	public static String getBinaryString(String s,Integer num){
		String temp=Integer.toBinaryString(num).toString();
		String str="";
		for(int i=0;i<32-temp.length();i++)
			str="0"+str;	
		String ss="";
		for(int i=0;i<31-num.toString().length()-s.length();i++)
			ss=" "+ss;
		return ss+s+num+"):"+str+temp;
	}
}
